package com.demo.java.OD301_350.OD331;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【数字游戏】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146149810
 */
public class OdMain {
    public static void main(String[] args) {

        // 创建扫描器对象以读取输入
        Scanner sc = new Scanner(System.in);

        // 循环处理每个测试用例
        while (sc.hasNext()) {

            // 读取输入的n和m
            int n = sc.nextInt();
            int m = sc.nextInt();

            // 创建一个数组存储输入的手牌数字
            int[] ints = new int[n];
            for (int i = 0; i < n; i++) {
                ints[i] = sc.nextInt();
            }

            // 记录当前的前缀和
            int preSum = 0;
            // 用于判断是否有符合条件的子数组
            boolean isTrue = false;
            // 用哈希集合记录前缀和的模值
            Set<Integer> remainders = new HashSet<>();

            // 遍历数组，计算前缀和的模值
            for (int i = 0; i < n; i++) {
                // 更新前缀和，并对m取模
                preSum = (preSum + ints[i]) % m;

                // 如果当前模值已经出现过，说明存在符合条件的子数组
                if (remainders.contains(preSum)) {
                    isTrue = true;
                    break;
                }

                // 如果模值为0，也说明当前子数组的和能够被m整除
                if (preSum == 0) {
                    isTrue = true;
                    break;
                }

                // 将当前模值添加到集合中
                remainders.add(preSum);
            }

            // 输出结果，若找到符合条件的子数组则输出1，否则输出0
            System.out.println(isTrue ? 1 : 0);
        }

        // 关闭扫描器对象
        sc.close();
    }
}